package com.library.admin.modules.user.service;

import com.library.admin.modules.user.bo.UserChangePasswordBO;
import com.library.admin.modules.user.bo.UserForgetPassword;
import com.library.admin.modules.user.bo.UserLoginBO;
import com.library.admin.modules.user.entity.User;
import com.library.admin.modules.user.vo.UserInfoVO;
import com.library.admin.modules.user.vo.UserVO;
import com.library.admin.modules.user.bo.UserPage;
import com.library.admin.modules.user.bo.UserInsert;
import com.library.admin.modules.user.bo.UserUpdate;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.library.common.service.bo.CurrentLoginUser;
import org.springframework.security.core.userdetails.UserDetails;

/**
 * @Author xyh
 * @Desc 用户表(User)表服务接口
 * @Date 2023-09-10 10:51:00
 */
public interface UserService extends IService<User> {

    /**
     * 分页查询
     */
    IPage<UserVO> queryByPage(UserPage page);

    /**
     * 初始化数据
     */
    void init();

    /**
     * 根据ID查详情
     */
    UserVO queryById(Integer id);

    /**
     * 新增数据
     */
    boolean insert(UserInsert userInsert);

    /**
     * 修改数据
     */
    boolean update(UserUpdate userUpdate);

    /**
     * 通过主键删除数据
     */
    boolean deleteById(Integer id);

    /**
     * 获取登录用户的信息
     *
     * @param username
     * @return
     */
    UserDetails loadUserByUsername(String username);

    /**
     * 登录，获取token
     *
     * @param bo
     * @return
     */
    String login(UserLoginBO bo);

    /**
     * 根据用户名获取用户信息
     *
     * @param username
     * @return
     */
    User getUserByUsername(String username);

    /**
     * 获取当前登录用户信息
     * @param currentLoginUser
     * @return
     */
    UserInfoVO getUserInfo(CurrentLoginUser currentLoginUser);

    /**
     * 校验验证码是否正确，true：正确
     * @param captchaCache 缓存中的验证码
     * @param verifyCode 页面传的验证码
     * @return
     */
    boolean checkCode(String captchaCache, String verifyCode);

    /**
     * 根据手机号获取用户（手机号唯一）
     * @param phone
     * @return
     */
    User getUserByPhone(Long phone);

    /**
     * 修改当前用户的密码
     *
     * @param bo
     * @param currentLoginUser
     */
    void changePassword(UserChangePasswordBO bo, CurrentLoginUser currentLoginUser);

    /**
     * 重置密码
     *
     * @param user
     * @param userForgetPassword
     */
    void forgetPassword(User user, UserForgetPassword userForgetPassword);

    /**
     * 充值
     *
     * @param userUpdate
     */
    void setInvestMoney(UserUpdate userUpdate);

}
